builder-tool: Pass through CDATA where it makes sense
authorMatthias Clasen <mclasen@redhat.com>
Fri, 13 Dec 2019 19:03:20 +0000 (14:03 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:26:46 +0000 (19:26 -0400)
This avoids a ton of escaping for
GtkBuilderListItemFactory::bytes.

gtk/tools/gtk-builder-tool-simplify.c

index 228912ab5f143cd9abc9d900cdf4fa660e7e3750..375702e72be1996b2c295add8ea1fa8d2fd2ba3e 100644 (file)
@@ -264,6 +264,36 @@ keep_for_rewrite (const char *class_name,
   return found;
 }
 
+static gboolean
+has_attribute (Element    *elt,
+               const char *name,
+               const char *value)
+{
+  int i;
+
+  for (i = 0; elt->attribute_names[i]; i++)
+    {
+      if (strcmp (elt->attribute_names[i], name) == 0 &&
+          (value == NULL || strcmp (elt->attribute_values[i], value) == 0))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+static gboolean
+is_cdata_property (Element *element)
+{
+  if (g_str_equal (element->element_name, "property") &&
+      has_attribute (element, "name", "bytes") &&
+      element->parent != NULL &&
+      g_str_equal (element->parent->element_name, "object") &&
+      has_attribute (element->parent, "class", "GtkBuilderListItemFactory"))
+    return TRUE;
+
+  return FALSE;
+}
+
 static gboolean
 is_pcdata_element (Element *element)
 {
@@ -486,23 +516,6 @@ value_is_default (Element      *element,
   return ret;
 }
 
-static gboolean
-has_attribute (Element    *elt,
-               const char *name,
-               const char *value)
-{
-  int i;
-
-  for (i = 0; elt->attribute_names[i]; i++)
-    {
-      if (strcmp (elt->attribute_names[i], name) == 0 &&
-          (value == NULL || strcmp (elt->attribute_values[i], value) == 0))
-        return TRUE;
-    }
-
-  return FALSE;
-}
-
 static const char *
 get_attribute_value (Element *element,
                      const char *name)
@@ -1794,9 +1807,18 @@ dump_element (Element *element,
         }
       else
         {
-          char *escaped = g_markup_escape_text (element->data, -1);
-          g_fprintf (output, "%s", escaped);
-          g_free (escaped);
+          if (is_cdata_property (element))
+            {
+              g_fprintf (output, "<![CDATA[");
+              g_fprintf (output, "%s", element->data);
+              g_fprintf (output, "]]>");
+            }
+          else
+            {          
+              char *escaped = g_markup_escape_text (element->data, -1);
+              g_fprintf (output, "%s", escaped);
+              g_free (escaped);
+            }
         }
       g_fprintf (output, "</%s>\n", element->element_name);
     }